25007
13138
병합이 @Id 변수를 할당하지 않을 때 JPA2에 지정된 경우가 있습니까? 그리고 예외를 발생시키지 않고 엔티티의 새 인스턴스를 반환합니까?
이 계층 구조가 있다고 가정합니다.
안녕하세요.
추상 클래스 Bar {
@신분증
@GeneratedValue (전략 = GenerationType.AUTO)
개인 긴 ID;
...
}
@실재
@Table (이름 = "BAR_1S")
@ 액세스 (AccessType.PROPERTY)
class Bar1 extends Bar {
...
}
@실재
@Table (이름 = "BAR_2S")
@ 액세스 (AccessType.PROPERTY)
class Bar2 extends Bar {
...
}
아직 발견되지 않은 이유 때문에 Bar1의 인스턴스는 merge () 후에 id를 얻지 만 Bar2의 인스턴스는 그렇지 않습니다. 적어도 그것이 어떻게 생겼는지. 저는 다양한 접근 방식을 시도해 왔습니다.
Hibernate (4.1.4.Final)가 특정 클래스의 인스턴스에 ID를 할당하고 싶지 않은 것처럼 보입니다. :-)
내가 가진 질문 :
누군가 이런 걸 먹었나요?
누군가가 Hibernate에서 ID가 설정된 곳을 말할 수 있습니까? 따라서 코드의 해당 부분을 디버깅하고 할당을 건너 뛰는 이유를 찾을 수 있습니다. IntelliJ는 엔터티의 필드 수정을 중단하지 않는 것 같습니다.
편집-환경 구성
운영체제 : LMDE amd64
데이터베이스 : MySQL (5.1.61-2) ConnectJ (5.1.17)
JVM : 1.7.0_04
최대 절전 모드 : 4.1.4. 최종
봄 : 3.1.1
편집-코드
모든 엔티티 클래스는 Bar의 (간) 직접 하위 클래스입니다. @Id가 정의 된 곳은 하나뿐입니다. 그리고 ID를 얻는 Bar2의 몇 가지 동일한 사례가 있습니다. 그러나 특히 Bar2는 그렇지 않습니다.
최종 Bar1 bar = 새로운 Bar1 ();
JpaTemplate.merge (bar); <-ID를 얻습니다.
최종 Bar2 bar = 새로운 Bar2 ();
JpaTemplate.merge (bar); <-ID가 없습니다.
애플리케이션은 엔티티를 병합하기 위해 Spring의 JpaTemplate을 사용하고 있습니다. 특정 클래스를 제외한 모든 것에 대해 정상적으로 실행됩니다.
따라서 ID를 할당하는 Hibernate 클래스를 찾을 수 있다면 내가 간과 한 어리석은 세부 사항을 알 수있을 것입니다. :-) 
첫 번째 참고 : JpaTemplate은 더 이상 사용되지 않으며 더 이상 사용해서는 안됩니다. EntityManager의 merge () 메서드에 위임하고 둘 다 엔터티를 반환합니다.
다음은 JPA 사양이 병합에 대해 말하는 내용입니다.
X가 새 엔티티 인스턴스 인 경우 새 관리 엔티티 인스턴스 X '는
생성되고 X의 상태가 새 관리 엔티티에 복사됩니다.
인스턴스 X '.
따라서 ID가 생성되면 병합 메서드에 전달하는 개체가 아닌 연결된 엔터티에 할당됩니다. 따라서 병합 메서드의 결과를 무시해서는 안됩니다. 대신에
jpaTemplate.merge (bar);
다음을 수행해야합니다.
bar = jpaTemplate.merge (bar);
또한 JPA 사양에 따르면
생성 된 ID는
데이터베이스 삽입이 발생했습니다.
그리고 이것은 아마도 당신이 신분증이없는 또 다른 이유 일 것입니다. MySQL의 AUTO 전략 인 AFAIK는 데이터베이스의 자동 증가 ID 열에 의존하는 것으로 구성되며 삽입이 완료된 후 ID 값을 가져올 수 있으며 Hibernate는 플러시가 절대적으로 필요할 때까지 기다립니다. 삽입을 수행하십시오. 병합 직후에 ID가 정말로 필요한 경우 다음을 수행하십시오.
bar = jpaTemplate.merge (bar);
jpaTemplate.flush ();
긴 id = bar.getId ();
|
그것을 발견 ! 병합은 @Transactional로 주석이 달린 오버로드 된 메서드에서 발생합니다. 오버로딩 메서드가 주석을 "상속"한다고 가정했습니다. 분명히 사실이 아닙니다.
@Transactional로 오버로딩 메서드에 주석을 달면 작동하는 것 같습니다.
어리석은 일이라는 것을 알고 ...
|
너의 답
StackExchange.ifUsing ( "editor", function () {
StackExchange.using ( "externalEditor", function () {
StackExchange.using ( "snippets", function () {
StackExchange.snippets.init ();
});
});
}, "코드 스 니펫");
StackExchange.ready (function () {
var channelOptions = {
태그 : "".split ( ""),
id : "1"
};
initTagRenderer ( "". split ( ""), "".split ( ""), channelOptions);
StackExchange.using ( "externalEditor", function () {
// 스 니펫이 활성화 된 경우 스 니펫 후에 편집기를 실행해야합니다.
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ( "snippets", function () {
createEditor ();
});
}
else {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor : false,
heartbeatType : '답변',
autoActivateHeartbeat : false,
convertImagesToLinks : true,
noModals : true,
showLowRepImageUploadWarning : true,
scoreToPostImages : 10,
bindNavPrevention : true,
접미사 : "",
imageUploader : {
brandingHtml : "Powered by \ u003ca href = \"https : //imgur.com/ \ "\ u003e \ u003csvg class = \"svg-icon \ "width = \"50 \ "height = \"18 \ "viewBox = \ "0 0 50 18 \"fill = \ "none \"xmlns = \ "http : //www.w3.org/2000/svg \"\ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.6931182C47.4335 4.61182 46.7256 4.52515.72644.69359545.2148 4.5251. 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \"M32.492 10.1419C32.492 12.697954 34.104182 14.0484 37.0451 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455C35.8209 11.5455 35.4954 10.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \"evenodd \ "clip-rule = \"evenodd \ "d = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 4.66231C28.9913 4.66231 285.733.4555 4.9456087 28.1109 5.50756087 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9839342 15.1301 25. 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.628335ZM24.1317 9.27932C24.1317 7.94324 7.0932C24.1317 7.94324 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \"M16.809.345 11.9512C16.8045 13.8962 17.2637 13.8962 13.2962 17.2637 13.8962 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.343364.62866 8.57809 4.89931 7.9466 5.5079C7.58314 4.9328 9.5117.10506 4.66232 6.51203 4.66232C5. .5104 6.91179 10.893 7.58817 10.893 8.94108V11.9512C10.893 13.2535 11.3711 13.8962 12.4044 13.8962C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 8.91179 15.42804 6.911.7080 / 16. u003e \ u003cpath d = \``M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 3.312C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2 / \ u003e \ u003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.72348861C3.7234 0.40159 0291 1.87209 0.400291Z \ "fill = \"# 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml : "\ u003ca href = \"https : //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \"https://stackoverflow.com / 법률 / 콘텐츠 정책 \ "\ u003e (콘텐츠 정책) \ u003c / a \ u003e",
allowUrls : true
},
onDemand : true,
폐기 선택기 : ".discard-answer"
, immediatelyShowMarkdownHelp : true, enableTables : true, enableSnippets : true
});
}
});
Stack Overflow에 대한 답변에 기여해 주셔서 감사합니다!
질문에 반드시 답해주십시오. 세부 사항을 제공하고 연구를 공유하십시오!
하지만 피하세요 ...
도움, 설명을 요청하거나 다른 답변에 응답합니다.
의견에 근거한 진술 작성 참고 자료 또는 개인적인 경험으로 백업하십시오.
자세한 내용은 훌륭한 답변 작성에 대한 팁을 참조하십시오.
초안 저장
초안이 삭제되었습니다.
가입 또는 로그인
StackExchange.ready (함수 () {
StackExchange.helpers.onClickDraftSave ( '# 로그인 링크');
});
Google을 사용하여 가입
Facebook을 사용하여 가입
이메일 및 비밀번호를 사용하여 가입
제출
게스트로 게시
이름
이메일
필수이지만 표시되지 않음
StackExchange.ready (
함수 () {
StackExchange.openid.initPostLogin ( '. New-post-login', 'https % 3a % 2f % 2fstackoverflow.com % 2fquestions % 2f10883539 % 2fcan-entitymanager-not-assign-an-id % 23new-answer', 'question_page' );
}
);
게스트로 게시
이름
이메일
필수이지만 표시되지 않음
답변 게시
포기
"답변 게시"를 클릭하면 서비스 약관, 개인 정보 보호 정책 및 쿠키 정책에 동의하게됩니다.
찾고있는 답변이 아닙니까? hibernate jpa-2.0 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.